package com.tiancheng.trade.payment.channel.umsmop.request;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.List;

/**
 * 银联商务统一下单参数
 */
@Getter
@Setter
@NoArgsConstructor
public class UmsMopUnifiedOrderRequest {
    /**
     * 必传：FALSE；消息ID，原样返回； max=64；
     */
    private String msgId;
    /**
     * 必传：TRUE；报文请求时间，格式yyyy-MM-dd HH:mm:ss；yyyy-MM-dd HH:mm:ss
     */
    private String requestTimestamp;
    /**
     * 必传：TRUE；商户订单号；商户自行生成注意：长度不要超过32位。 min=6 max=32长度不超过32位；
     */
    private String merOrderId;
    /**
     * 账单号，小于28位 （扫码支付使用，非扫码使用merOrderId）
     */
    private String billNo;
    /**
     * 账单日期，格式yyyy-MM-dd （扫码支付使用）
     */
    private String billDate;
    /**
     * 账单描述 （扫码支付使用）
     */
    private String billDesc;
    /**
     * 钱包选项 单一钱包支付传=SINGLE, 多钱包支付传=MULTIPLE （扫码支付使用）
     */
    private String walletOption;
    /**
     * 必传：FALSE；请求系统预留字段； max=255；
     */
    private String srcReserve;
    /**
     * 必传：TRUE；商户号；min=8 max=32；
     */
    private String mid;
    /**
     * 必传：TRUE；微信子商户appId；商户AppId，用于调起微信小程序  max=32；
     */
    private String subAppId;
    /**
     * 必传：TRUE；终端号；min=2 max=32；
     */
    private String tid;
    /**
     * 必传：FALSE；机构商户号；min=8 max=32；
     */
    private String instMid;
    /**
     * 订单商品信息，必传：FALSE；
     */
    private List<UmsProduct> goods;

    /**
     * 二维码ID，针对需要自行生成二维码的情况
     */
    private String qrCodeId;
    /**
     * 手续费比例
     */
    private String feeRatio;
    /**
     * 确认成本补贴 新悦融益业务 该字段必传；
     */
    private String costSubsidy;
    /**
     * 商品
     */
    @Getter
    @Setter
    @NoArgsConstructor
    public static class UmsProduct {
        /**
         * max=1024；
         */
        private Integer discount;
        /**
         * max=32；
         */
        private String unit;
        /**
         * 商品ID； max=64；
         */
        private String goodsId;
        /**
         * 商品名称； max=256；
         */
        private String goodsName;
        /**
         * 商品数量； max=20；
         */
        private Integer quantity;
        /**
         * 商品单价（分）； max=20；
         */
        private Integer price;
        /**
         * 商品分类； max=64；
         */
        private String goodsCategory;
        /**
         * 商品说明； max=1024；
         */
        private String body;
        /**
         * 子商户号；min=8 max=32；
         */
        private String subMerchantId;
        /**
         * 商户子订单号；min=6 max=32长度不超过32位；
         */
        private String merOrderId;
        /**
         * 子商户商品总额；min=0 max=100000000；
         */
        private Integer subOrderAmount;
    }

    /**
     * 必传：FALSE；商户附加数据； max=255；
     */
    private String attachedData;
    /**
     * 必传：FALSE；订单过期时间；订单过期时间，为空则使用系统默认过期时间（30分钟），格式yyyy-MM-dd HH:mm:ss
     */
    private String expireTime;
    /**
     * 必传：fasle；商品标记，用于优惠活动； max=32；
     */
    private String goodsTag;
    /**
     * 必传：FALSE；商品交易单号；跟goods字段二选一，商品信息通过goods.add接口提前上送
     */
    private String goodsTradeNo;
    /**
     * 必传：FALSE；订单描述；不超过255个字节（微信支付：上送值不大于128个字节，超过128字节后的部分会被截掉）  max=255；
     */
    private String orderDesc;
    /**
     * 必传：FALSE；订单原始金额，单位分，用于记录前端系统打折前的金额；min=1 max=100000000；
     */
    private Integer originalAmount;
    /**
     * 必传：FALSE；商品ID；
     */
    private String productId;
    /**
     * 必传：TRUE；支付总金额，单位分；若divisionFlag为true，
     * 则：totalAmount = subOrders字段中的所有totalAmount值之和 加上 platformAmount值=goods中的所有subOrderAmount值之和。 min=1 max=100000000；
     */
    private Integer totalAmount;
    /**
     * 必传：FALSE；分账标记；暂时只支持微信（WXPay.jsPay）、支付宝（trade.jsPay）支付 和 银联云闪付（uac.appOrder）。若为true，
     * 则goods字段和subOrders字段不能同时为空；且secureTransaction字段上送false或不上送。
     */
    private Boolean divisionFlag;
    /**
     * 必传：FALSE；平台商户分账金额；若分账标记传，则分账金额必传 min=0 max=100000000；
     */
    private Integer platformAmount;
    /**
     * 子订单信息，必传：FALSE；在传分账标记的情况下，若传子商户号，子商户分账金额必传，即ubOrders每个元素的mid和totalAmount非空 且 mid不超过20个。
     * （分账方案subOrders里子商户分账总额+platformAmount要与支付总额totalAmount相等）。
     */
    private List<SubOrder> subOrders;

    /**
     * 子订单
     */
    @Getter
    @Setter
    @NoArgsConstructor
    public static class SubOrder {
        /**
         * 子商户号；min=8 max=32；
         */
        private String mid;
        /**
         * 商户子订单号；min=6 max=32长度不超过32位；
         */
        private String merOrderId;
        /**
         * 子商户分账金额；min=0 max=100000000；
         */
        private Integer totalAmount;
    }

    /**
     * 必传：FALSE；支付结果通知地址； max=255；
     */
    private String notifyUrl;
    /**
     * 必传：FALSE；订单展示页面； max=255；
     */
    private String showUrl;
    /**
     * 必传：FALSE；签名算法；上送值为：SHA256 （请勿上送MD5）
     */
    private String signType;
    /**
     * 必传：FALSE；交易类型；微信必传:APP
     */
    private String tradeType;
    /**
     * 必传：FALSE；商户用户号；全民付、applepay下单时 必传  max=32；
     */
    private String merchantUserId;
    /**
     * 必传：FALSE；实名认证手机号；Base64编码  max=20；
     */
    private String mobile;
    /**
     * 必传：FALSE；实名认证姓名；Base64编码  max=32；
     */
    private String name;
    /**
     * 必传：FALSE；实名认证证件类型；证件类型，支付宝支持身份证：IDENTITY_CARD、护照：PASSPORT、军官证：OFFICER_CARD、士兵证：SOLDIER_CARD、户口本：HOKOU  max=32；
     */
    private String certType;
    /**
     * 必传：FALSE；实名认证证件号；Base64编码  max=64；
     */
    private String certNo;
    /**
     * 必传：FALSE；是否需要实名认证；需要实名认证时置为 T  max=32；
     */
    private String fixBuyer;
    /**
     * 必传：FALSE；标识是否是担保交易；取值：true或false，默认false若上送为true，则交易的金额将会被暂缓结算。
     * 调用担保完成接口后，完成部分金额会在t+1日结算给商户，剩余部分金额退还用户。调用担保撤销接口，则全部资金退还给用户。
     * 30天后 没有主动调用担保完成 且 没有主动调用担保撤销的交易 将会自动按撤销处理。
     */
    private String secureTransaction;
    /**
     * 必传：FALSE；异步分账标记；若为true，则goods字段和subOrders字段不能同时为空；且secureTransaction字段上送false或不上送。
     * 退货订单不允许做子订单操作已确认的子订单，不允许隔天再确认
     */
    private Boolean asynDivisionFlag;
    /**
     * 是否需要限制信用卡支付；取值：true或false，默认false
     */
    private String limitCreditCard;
    /**
     * 必传：FALSE；指定支付方式；商户可通过上传该字段，指定想要支持的支付方式(仅支持支付宝交易)。一笔订单中仅允许商户一次上送一个值，
     * 可上送的取值范围为：balance（余额），moneyFund（余额宝），pcredit（花呗），pcreditpayInstallment（花呗分期），creditCard（信用卡），
     * debitCardExpress（借记卡）  max=128；
     */
    private String enablePayChnl;
    /**
     * 必传：FALSE；花呗分期数；仅支持3、6、12仅支持支付宝支付
     */
    private Integer installmentNumber;
    /**
     * 必传：TRUE；签名；签名规则
     */
    private String sign;
    /**
     * 必传：FALSE；网页跳转地址
     */
    private String returnUrl;
    /**
     * 必传：微信必传；用户子标识
     */
    private String subOpenId;
    /**
     * 支付宝买家ID
     */
    private String userId;

}
